 
class IncricaoCadastroPassController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
    def index = {
        def inscricaoInstance = Inscricao.findByIdAndChave(params.id,params.chave)
        if (!inscricaoInstance  ) {render 'Não Permitido'}    else {
            def incricaoCadastroPassInstance  = IncricaoCadastroPass.findByInscricao(inscricaoInstance)
            if (!incricaoCadastroPassInstance) {
                incricaoCadastroPassCreate(inscricaoInstance)
            } else {
                GrupoPai.findAllByEspecifico('0').each{
                    def grupoPai = it
                    if (!incricaoCadastroPassInstance.incricaoCadastroPassGrupoPai?.grupoPai.find{it == grupoPai }) {
                        incricaoCadastroPassInstance.addToIncricaoCadastroPassGrupoPai(new IncricaoCadastroPassGrupoPai('grupoPai' : it))
                    }
                }
            }
            if (IncricaoCadastroPass?.verificaItensEspecificos(incricaoCadastroPassInstance?.id) == 0) {
                redirect(action: "create" , params:['id': incricaoCadastroPassInstance.inscricao.id , 'chave' : params.chave])
            }             
            return ['incricaoCadastroPassInstance' : incricaoCadastroPassInstance]
        }
    }
    def incricaoCadastroPassCreate = { inscricaoInstance ->
        def incricaoCadastroPassInstance = new IncricaoCadastroPass(inscricao:inscricaoInstance)
        if(incricaoCadastroPassInstance.save(flush:true)) {
            GrupoPai.findAllByEspecifico('0').each{
                def grupoPai = it
                if (!incricaoCadastroPassInstance.incricaoCadastroPassGrupoPai?.grupoPai.find{it == grupoPai }) {
                    incricaoCadastroPassInstance.addToIncricaoCadastroPassGrupoPai(new IncricaoCadastroPassGrupoPai('grupoPai' : it))
                }
            }
        }
        redirect(action: "index" , params:['id': incricaoCadastroPassInstance.inscricao.id , 'chave' : incricaoCadastroPassInstance.inscricao.chave])
    }
    def escolheEspecifico = {
        def incricaoCadastroPassInstance = IncricaoCadastroPass.get(params.inscricao.id)
        if  (incricaoCadastroPassInstance.incricaoCadastroPassGrupoEspecifico.count() < 5 ) {
            for (int i = 1 ; i <= 5 ; i ++) {
                if (!incricaoCadastroPassInstance.incricaoCadastroPassGrupoEspecifico.find { it.especifico == i} ) {
                    incricaoCadastroPassInstance.addToIncricaoCadastroPassGrupoEspecifico(new IncricaoCadastroPassGrupoEspecifico('especifico' : i))
                }
            }
        }
        return [incricaoCadastroPassInstance :incricaoCadastroPassInstance ,incricaoCadastroPassGrupoEspecifico: incricaoCadastroPassInstance.incricaoCadastroPassGrupoEspecifico.sort { it.especifico } ]
       
    }
    def cancel = {
        redirect(action: "index" , params:['id': params.inscricao.id , 'chave' : params.chave])
    }
    def confirmaPass = {
        def itens
        def inscricaoInstance = Inscricao.findByIdAndChave(params.id,params.chave)
        if (!inscricaoInstance) {render 'Não Permitido'}    else {
            def incricaoCadastroPassInstance  = IncricaoCadastroPass.findByInscricao(inscricaoInstance)
            if (!incricaoCadastroPassInstance) {
                incricaoCadastroPassInstance = new IncricaoCadastroPass()
                incricaoCadastroPassInstance.properties = params

            }  else  {
                if (IncricaoCadastroPassGrupoPai.countByIncricaoCadastroPass(incricaoCadastroPassInstance) <  22) {
                    incricaoCadastroPassInstance.delete()
                }
                itens = incricaoCadastroPassInstance.incricaoCadastroPassGrupoPai.sort{it.grupoPai.ordem}

            }
            return [incricaoCadastroPassInstance: incricaoCadastroPassInstance , grupos : grupos() , itens : itens ]
        }
    }
    def saveFinalizarPass = {
        def incricaoCadastroPassInstance = IncricaoCadastroPass.get(params.id)
        incricaoCadastroPassInstance.alteracoes ++
        incricaoCadastroPassInstance.submetePass = true
        incricaoCadastroPassInstance.dataEnvioPass = new Date()
        incricaoCadastroPassInstance.save()
        redirect(action: "index" , params:['id': params.inscricao.id , 'chave' : params.chave])
    }
    def escolheEspecificoSave = {         
        params.incricaoCadastroPassGrupoEspecifico.id.each {
            def incricaoCadastroPassGrupoEspecifico = IncricaoCadastroPassGrupoEspecifico.get(it)
            def especifico = false
            if (params."especifico${incricaoCadastroPassGrupoEspecifico.especifico}" == "on") {
                especifico = true
            }
            if (incricaoCadastroPassGrupoEspecifico.ativo !=  especifico ) {            
                if (especifico == true) {                 
                    GrupoPai.findAllByEspecifico(incricaoCadastroPassGrupoEspecifico.especifico).each {
                        def incricaoCadastroPassGrupoEspecificoItens  = new IncricaoCadastroPassGrupoEspecificoItens(grupoPai:it , incricaoCadastroPassGrupoEspecifico : incricaoCadastroPassGrupoEspecifico)
                        incricaoCadastroPassGrupoEspecificoItens.itens = ''
                        it.grupoFilhos.each {
                            incricaoCadastroPassGrupoEspecificoItens.itens += '0,'
                        }
                        incricaoCadastroPassGrupoEspecificoItens.save()
                    }
                } else {
                    incricaoCadastroPassGrupoEspecifico.incricaoCadastroPassGrupoEspecificoItens.findAll { it.incricaoCadastroPassGrupoEspecifico = incricaoCadastroPassGrupoEspecifico }.each {
                        incricaoCadastroPassGrupoEspecifico.removeFromIncricaoCadastroPassGrupoEspecificoItens(IncricaoCadastroPassGrupoEspecificoItens.get(it.id))
                    }
                }

            } else {
            }
            incricaoCadastroPassGrupoEspecifico.ativo = especifico
            incricaoCadastroPassGrupoEspecifico.save()
        }               
        redirect(action: "index" , params:['id': params.inscricao.id , 'chave' : params.chave])
    }

    def createEspecifico = {
        def incricaoCadastroPassGrupoEspecifico  = IncricaoCadastroPassGrupoEspecifico.get(params.id)
        if (incricaoCadastroPassGrupoEspecifico.submetePassEspecifico == true) {render 'Não Permitido'}    else {
            return   [incricaoCadastroPassGrupoEspecifico  : IncricaoCadastroPassGrupoEspecifico.get(params.id) ]
        }
    }
    def saveEspecifico = {
        def i = 0
        params.incricaoCadastroPassGrupoEspecifico.id.each{
            def incricaoCadastroPassGrupoEspecificoInstance  = IncricaoCadastroPassGrupoEspecificoItens.get(it)
            def s = 0
            def item =''
            incricaoCadastroPassGrupoEspecificoInstance.grupoPai.grupoFilhos.each {
                item +=   params."item${i}.${s}" + ','
                s++
            }
            i++
            incricaoCadastroPassGrupoEspecificoInstance.itens = item
            if (i == 1) {
                incricaoCadastroPassGrupoEspecificoInstance.incricaoCadastroPassGrupoEspecifico.incricaoCadastroPass.alteracoes ++
                incricaoCadastroPassGrupoEspecificoInstance.save()
            }
        }
        redirect(action: "index" , params:['id': IncricaoCadastroPassGrupoEspecifico.get(params.inscricao.id).incricaoCadastroPass.inscricao.id , 'chave' : params.chave])
    }
    def confirmaEspecifico = {
        return   [incricaoCadastroPassGrupoEspecifico  : IncricaoCadastroPassGrupoEspecifico.get(params.id) ]
    }
    def confirmaEspecificoSave = {
        def incricaoCadastroPassGrupoEspecificoInstance = IncricaoCadastroPassGrupoEspecifico.get(params.id)
        if (IncricaoCadastroPassGrupoEspecifico.verificaSeExisteItemNaoPreenchido(params.id) == false) {
            render 'Não Permitido'
        } else {
            incricaoCadastroPassGrupoEspecificoInstance.submetePassEspecifico = true
            incricaoCadastroPassGrupoEspecificoInstance.dataEnvioPassEspecifico = new Date()
            incricaoCadastroPassGrupoEspecificoInstance.save()
            
        }

        redirect(action: "index" , params:['id': incricaoCadastroPassGrupoEspecificoInstance.incricaoCadastroPass.inscricao.id , 'chave' : params.chave])
    }

    def confirmaEspecificoCancelar = {
        redirect(action: "index" , params:['id': IncricaoCadastroPassGrupoEspecifico.get(params.id).incricaoCadastroPass.inscricao.id , 'chave' : params.chave])
      
    }
    def create = {
        def itens
        def inscricaoInstance = Inscricao.findByIdAndChave(params.id,params.chave)
        if (!inscricaoInstance) {render 'Não Permitido'}    else {
            def incricaoCadastroPassInstance  = IncricaoCadastroPass.findByInscricao(inscricaoInstance)
 
            if (incricaoCadastroPassInstance.submetePass == true) {render 'Não Permitido'}    else {
                if (!incricaoCadastroPassInstance) {
                    incricaoCadastroPassInstance = new IncricaoCadastroPass()
                    incricaoCadastroPassInstance.properties = params
          
                }  else  {
                    if (IncricaoCadastroPassGrupoPai.countByIncricaoCadastroPass(incricaoCadastroPassInstance) <  22) {
                        incricaoCadastroPassInstance.delete()
                    }
                    itens = incricaoCadastroPassInstance.incricaoCadastroPassGrupoPai.sort{it.grupoPai.ordem}
                
                }

                return [incricaoCadastroPassInstance: incricaoCadastroPassInstance , grupos : grupos() , itens : itens ]
            }
        }
    }

    public grupos () {
        return [GrupoPai.findAllByOrdemBetweenAndEspecifico(1,4,0) ,
            GrupoPai.findAllByOrdemBetweenAndEspecifico(5,12,0) ,
            GrupoPai.findAllByOrdemBetweenAndEspecifico(13,22,0)]
    }
    def save = {
        def erro = false
        def inscricaoInstance = Inscricao.findByIdAndChave(params.inscricao.id,params.chave)
        if (!inscricaoInstance) {render 'Não Permitido'}    else {
            def incricaoCadastroPassInstance  = IncricaoCadastroPass.findByInscricao(inscricaoInstance)
            if (!incricaoCadastroPassInstance) {
                incricaoCadastroPassInstance = new IncricaoCadastroPass()
                incricaoCadastroPassInstance.properties = params
                incricaoCadastroPassInstance.inscricao = inscricaoInstance

                if(incricaoCadastroPassInstance.save()) {

                    for (int i = 1 ; i < GrupoPai.countByEspecifico(0) +1 ; i++ ) {
                        def incricaoCadastroPassGrupoPaiInstance = new IncricaoCadastroPassGrupoPai()
                        incricaoCadastroPassGrupoPaiInstance.incricaoCadastroPass = incricaoCadastroPassInstance
                        incricaoCadastroPassGrupoPaiInstance.grupoPai =  GrupoPai.findByOrdem(i)
  
                        if (params."grupo${i}" == 'on') {
                            incricaoCadastroPassGrupoPaiInstance.aplicavel = true
                            incricaoCadastroPassGrupoPaiInstance.itens = params."${(((i-1)*4) +1)}" + "," +  params."${(((i-1)*4) +2)}" + "," + params."${(((i-1)*4) +3)}" + "," + params."${(((i-1)*4) + 4)}"
                        } else  {

                        }
 
                        if (incricaoCadastroPassGrupoPaiInstance.save()) {

                        } else {
                            incricaoCadastroPassGrupoPaiInstance.errors.allErrors.each {
                                println it
                            }
                            erro = true
                        }
                    }
                    if (erro == true) {
                        incricaoCadastroPassInstance.delete()
                        incricaoCadastroPassInstance.errors.allErrors.each {
                            println it
                        }
                        flash.message = "Houve um Erro na Criação do PASS por favor tente novamente"
                        redirect(action: "create" , params:['id': params.inscricao.id , 'chave' : params.chave])
                    }

                } 
            } else  { 
                for (int i = 1 ; i < GrupoPai.countByEspecifico(0) +1 ; i++ ) {
                    def incricaoCadastroPassGrupoPaiInstance =  IncricaoCadastroPassGrupoPai.findById(params."${'id'+i}")
                    if (!incricaoCadastroPassGrupoPaiInstance) {      
                        incricaoCadastroPassGrupoPaiInstance = new IncricaoCadastroPassGrupoPai()
                        incricaoCadastroPassGrupoPaiInstance.incricaoCadastroPass = incricaoCadastroPassInstance
                        incricaoCadastroPassGrupoPaiInstance.grupoPai =  GrupoPai.findByOrdem(i)
                    }
                    incricaoCadastroPassGrupoPaiInstance.aplicavel = true
                    incricaoCadastroPassGrupoPaiInstance.grupoPai.id
                    incricaoCadastroPassGrupoPaiInstance.itens = params."${(((i-1)*4) +1)}" + "," +  params."${(((i-1)*4) +2)}" + "," + params."${(((i-1)*4) +3)}" + "," + params."${(((i-1)*4) + 4)}"
                    incricaoCadastroPassGrupoPaiInstance.save()

                }
                incricaoCadastroPassInstance.alteracoes++
                incricaoCadastroPassInstance.save()  
            }
            redirect(action: "index" , params:['id': params.inscricao.id , 'chave' : params.chave])
        }
    }
    def show = {
        def incricaoCadastroPassInstance = IncricaoCadastroPass.get(params.id)
        if (!incricaoCadastroPassInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'incricaoCadastroPass.label', default: 'IncricaoCadastroPass'), params.id])}"
            redirect(action: "list")
        }
        else {
            [incricaoCadastroPassInstance: incricaoCadastroPassInstance]
        }
    }
    def delete = {
        def incricaoCadastroPassInstance = IncricaoCadastroPass.get(params.id)
        if (incricaoCadastroPassInstance) {
            try {
                incricaoCadastroPassInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'incricaoCadastroPass.label', default: 'IncricaoCadastroPass'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'incricaoCadastroPass.label', default: 'IncricaoCadastroPass'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'incricaoCadastroPass.label', default: 'IncricaoCadastroPass'), params.id])}"
            redirect(action: "list")
        }
    }
}
